1. Data Wrangling

Badanym zbiorem danych jest zestaw Czynniki, który opisuje czynniki wpływające na wyniki uczniów.

1.1. Analiza wstępna

dane
## # A tibble: 6,607 × 20
##    Hours_Studied Attendance Parental_Involvement Access_to_Resources
##            <dbl>      <dbl> <chr>                <chr>              
##  1            23         84 Low                  High               
##  2            19         64 Low                  Medium             
##  3            24         98 Medium               Medium             
##  4            29         89 Low                  Medium             
##  5            19         92 Medium               Medium             
##  6            19         88 Medium               Medium             
##  7            29         84 Medium               Low                
##  8            25         78 Low                  High               
##  9            17         94 Medium               High               
## 10            23         98 Medium               Medium             
## # ℹ 6,597 more rows
## # ℹ 16 more variables: Extracurricular_Activities <chr>, Sleep_Hours <dbl>,
## #   Previous_Scores <dbl>, Motivation_Level <chr>, Internet_Access <chr>,
## #   Tutoring_Sessions <dbl>, Family_Income <chr>, Teacher_Quality <chr>,
## #   School_Type <chr>, Peer_Influence <chr>, Physical_Activity <dbl>,
## #   Learning_Disabilities <chr>, Parental_Education_Level <chr>,
## #   Distance_from_Home <chr>, Gender <chr>, Exam_Score <dbl>
str(dane)
## spc_tbl_ [6,607 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Hours_Studied             : num [1:6607] 23 19 24 29 19 19 29 25 17 23 ...
##  $ Attendance                : num [1:6607] 84 64 98 89 92 88 84 78 94 98 ...
##  $ Parental_Involvement      : chr [1:6607] "Low" "Low" "Medium" "Low" ...
##  $ Access_to_Resources       : chr [1:6607] "High" "Medium" "Medium" "Medium" ...
##  $ Extracurricular_Activities: chr [1:6607] "No" "No" "Yes" "Yes" ...
##  $ Sleep_Hours               : num [1:6607] 7 8 7 8 6 8 NA 6 6 8 ...
##  $ Previous_Scores           : num [1:6607] 73 59 91 98 65 89 68 50 80 71 ...
##  $ Motivation_Level          : chr [1:6607] "Low" "Low" "Medium" "Medium" ...
##  $ Internet_Access           : chr [1:6607] "Yes" "Yes" "Yes" "Yes" ...
##  $ Tutoring_Sessions         : num [1:6607] 0 2 2 1 3 3 1 1 0 0 ...
##  $ Family_Income             : chr [1:6607] "Low" "Medium" "Medium" "Medium" ...
##  $ Teacher_Quality           : chr [1:6607] "Medium" "Medium" "Medium" "Medium" ...
##  $ School_Type               : chr [1:6607] "Public" "Public" "Public" "Public" ...
##  $ Peer_Influence            : chr [1:6607] "Positive" "Negative" "Neutral" "Negative" ...
##  $ Physical_Activity         : num [1:6607] 3 4 4 4 4 3 2 2 1 5 ...
##  $ Learning_Disabilities     : chr [1:6607] "No" "No" "No" "No" ...
##  $ Parental_Education_Level  : chr [1:6607] "High School" "College" "Postgraduate" "High School" ...
##  $ Distance_from_Home        : chr [1:6607] "Near" "Moderate" "Near" "Moderate" ...
##  $ Gender                    : chr [1:6607] "Male" "Female" "Male" "Male" ...
##  $ Exam_Score                : num [1:6607] 67 61 74 71 NA 71 67 66 69 72 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Hours_Studied = col_double(),
##   ..   Attendance = col_double(),
##   ..   Parental_Involvement = col_character(),
##   ..   Access_to_Resources = col_character(),
##   ..   Extracurricular_Activities = col_character(),
##   ..   Sleep_Hours = col_double(),
##   ..   Previous_Scores = col_double(),
##   ..   Motivation_Level = col_character(),
##   ..   Internet_Access = col_character(),
##   ..   Tutoring_Sessions = col_double(),
##   ..   Family_Income = col_character(),
##   ..   Teacher_Quality = col_character(),
##   ..   School_Type = col_character(),
##   ..   Peer_Influence = col_character(),
##   ..   Physical_Activity = col_double(),
##   ..   Learning_Disabilities = col_character(),
##   ..   Parental_Education_Level = col_character(),
##   ..   Distance_from_Home = col_character(),
##   ..   Gender = col_character(),
##   ..   Exam_Score = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>

Zestaw ten posiada 20 zmiennych oraz 6607 obserwacji.

1.2. Czyszczenie danych

Dane ogólnie rzecz biorąc nie wymagają dużo oczyszczania, nazwy zmiennych nie zawierają spacji ani polskich znaków, a obserwacje są zapisane w poprawny sposób. Zmienne jakościowe można jednak zmienić na typ factor, w celu ułatwienia analizy.

1.2.1. Zmiana typu zmiennych jakościowych na typ factor

Poniższy kod został wykorzystany, aby zmienić typ zmiennych jakościowych z typu character na typ factor.

dane$Parental_Involvement <- ifelse(dane$Parental_Involvement == "Low", 1,
                                    ifelse(dane$Parental_Involvement == "Medium", 2, 3))
dane$Parental_Involvement <- factor(dane$Parental_Involvement, levels = c(1, 2, 3),
                                    labels = c("Low", "Medium", "High"), ordered = TRUE)

dane$Access_to_Resources <- ifelse(dane$Access_to_Resources == "Low", 1,
                                   ifelse(dane$Access_to_Resources == "Medium", 2, 3))
dane$Access_to_Resources <- factor(dane$Access_to_Resources, levels = c(1, 2, 3),
                                   labels = c("Low", "Medium", "High"), ordered = TRUE)

dane$Extracurricular_Activities <- ifelse(dane$Extracurricular_Activities == "No", 0, 1)
dane$Extracurricular_Activities <- factor(dane$Extracurricular_Activities, levels = c(0, 1),
                                          labels = c("No", "Yes"))

dane$Motivation_Level <- ifelse(dane$Motivation_Level == "Low", 1,
                                ifelse(dane$Motivation_Level == "Medium", 2, 3))
dane$Motivation_Level <- factor(dane$Motivation_Level, levels = c(1, 2, 3),
                                labels = c("Low", "Medium", "High"), ordered = TRUE)

dane$Internet_Access <- ifelse(dane$Internet_Access == "No", 0, 1)
dane$Internet_Access <- factor(dane$Internet_Access, levels = c(0, 1), labels = c("No", "Yes"))

dane$Family_Income <- ifelse(is.na(dane$Family_Income), NA,
                             ifelse(dane$Family_Income == "Low", 1,
                                    ifelse(dane$Family_Income == "Medium", 2, 3)))
dane$Family_Income <- factor(dane$Family_Income, levels = c(1, 2, 3),
                             labels = c("Low", "Medium", "High"), ordered = TRUE)

dane$Teacher_Quality <- ifelse(is.na(dane$Teacher_Quality), NA,
                               ifelse(dane$Teacher_Quality == "Low", 1,
                                      ifelse(dane$Teacher_Quality == "Medium", 2, 3)))
dane$Teacher_Quality <- factor(dane$Teacher_Quality, levels = c(1, 2, 3),
                               labels = c("Low", "Medium", "High"), ordered = TRUE)

dane$School_Type <- ifelse(dane$School_Type == "Public", 1, 2)
dane$School_Type <- factor(dane$School_Type, levels = c(1, 2), labels = c("Public", "Private"))

dane$Peer_Influence <- ifelse(dane$Peer_Influence == "Negative", 1,
                              ifelse(dane$Peer_Influence == "Neutral", 2, 3))
dane$Peer_Influence <- factor(dane$Peer_Influence, levels = c(1, 2, 3),
                              labels = c("Negative", "Neutral", "Positive"), ordered = TRUE)

dane$Learning_Disabilities <- ifelse(dane$Learning_Disabilities == "No", 0, 1)
dane$Learning_Disabilities <- factor(dane$Learning_Disabilities, levels = c(0, 1),
                                     labels = c("No", "Yes"))

dane$Parental_Education_Level <- ifelse(is.na(dane$Parental_Education_Level), NA,
                                        ifelse(dane$Parental_Education_Level == "High School", 1,
                                        ifelse(dane$Parental_Education_Level == "College", 2, 3)))
dane$Parental_Education_Level <- factor(dane$Parental_Education_Level, levels = c(1, 2, 3),
                                        labels = c("High School", "College", "Postgraduate"),
                                        ordered = TRUE)

dane$Distance_from_Home <- ifelse(is.na(dane$Distance_from_Home), NA,
                                  ifelse(dane$Distance_from_Home == "Far", 1,
                                         ifelse(dane$Distance_from_Home == "Moderate", 2, 3)))
dane$Distance_from_Home <- factor(dane$Distance_from_Home, levels = c(1, 2, 3),
                                  labels = c("Far", "Moderate", "Near"), ordered = TRUE)

dane$Gender <- ifelse(dane$Gender == "Female", 1, 2)
dane$Gender <- factor(dane$Gender, levels = c(1, 2), labels = c("Female", "Male"))

1.2.2. Walidacje

Stworzone zostały reguły walidacyjne dla każdej zmiennej. Dla zmiennych ilościowych wprowadzono regułę wymagającego, aby zmienna była liczbą oraz określono przedziały, w których mogą się znajdować wynikające z charakteru zmiennej, np. liczba godzin snu musi być większa lub równa 0, ale nie większa niż 24 ze względu liczbę godzin w ciągu dnia. Dla zmiennych jakościowych wprowadzono ograniczenia wymagające od nich bycia zmienną factor oraz sprawdzające czy obserwacje opisane są jedną z możliwych odpowiedzi dla dane zmiennej.

# Stworzenie reguł walidacyjnych

rules <- check_that(dane,
  
  # Reguły dla zmiennej Hours_Studied
  
  is.numeric(Hours_Studied), #1
  Hours_Studied >= 0, #2
  Hours_Studied <= 168, #3
  
  # Reguły dla zmiennej Attendance
  
  is.numeric(Attendance), #4
  Attendance >= 0, #5
  Attendance <= 100, #6
  
  # Reguły dla zmiennej Parental_Involvement
  
  is.factor(Parental_Involvement), #7
  Parental_Involvement %in% c("Low", "Medium", "High"), #8
  
  # Reguły dla zmiennej Access_to_Resources
  
  is.factor(Access_to_Resources), #9
  Access_to_Resources %in% c("Low", "Medium", "High"), #10
  
  # Reguły dla zmiennej Extracurricular_Activities
  
  is.factor(Extracurricular_Activities), #11
  Extracurricular_Activities %in% c("No", "Yes"), #12
  
  # Reguły dla zmiennej Sleep_Hours
  
  is.numeric(Sleep_Hours), #13
  Sleep_Hours >= 0, #14
  Sleep_Hours <= 24, #15
  
  # Reguły dla zmiennej Previous_Scores
  
  is.numeric(Previous_Scores), #16
  Previous_Scores >= 0, #17
  Previous_Scores <= 100, #18
  
  # Reguły dla zmiennej Motivation_Level
  
  is.factor(Motivation_Level), #19
  Motivation_Level %in% c("Low", "Medium", "High"), #20
  
  # Reguły dla zmiennej Internet_Access
  
  is.factor(Internet_Access), #21
  Internet_Access %in% c("No", "Yes"), #22
  
  # Reguły dla zmiennej Tutoring_Sessions
  
  is.numeric(Tutoring_Sessions), #23
  Tutoring_Sessions >= 0, #24
  (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0, #25
  
  # Reguły dla zmiennej Family_Income
  
  is.factor(Family_Income), #26
  Family_Income %in% c("Low", "Medium", "High"), #27
  
  # Reguły dla zmiennej Teacher_Quality
  
  is.factor(Teacher_Quality), #28
  Teacher_Quality %in% c("Low", "Medium", "High"), #29
  
  # Reguły dla zmiennej School_Type
  
  is.factor(School_Type), #30
  School_Type %in% c("Public", "Private"), #31
  
  # Reguły dla zmiennej Peer_Influence
  
  is.factor(Peer_Influence), #32
  Peer_Influence %in% c("Negative", "Neutral", "Positive"), #33
  
  # Reguły dla zmiennej Physical_Activity
  
  is.numeric(Physical_Activity), #34
  Physical_Activity >= 0, #35
  Physical_Activity <= 168, #36
  
  # Reguły dla zmiennej Learning_Disabilities
  
  is.factor(Learning_Disabilities), #37
  Learning_Disabilities %in% c("No", "Yes"), #38
  
  # Reguły dla zmiennej Parental_Education_Level
  
  is.factor(Parental_Education_Level), #39
  Parental_Education_Level %in% c("High School", "College", "Postgraduate"), #40
  
  # Reguły dla zmiennej Distance_from_Home
  
  is.factor(Distance_from_Home), #41
  Distance_from_Home %in% c("Far", "Moderate", "Near"), #42
  
  # Reguły dla zmiennej Gender
  
  is.factor(Gender), #43
  Gender %in% c("Female", "Male"), #44
  
  # Reguły dla zmiennej Exam_Score
  
  is.numeric(Exam_Score), #45
  Exam_Score >= 0, #46
  Exam_Score <= 100 #47
)

summary(rules)
##    name items passes fails nNA error warning
## 1   V01     1      1     0   0 FALSE   FALSE
## 2   V02  6607   6607     0   0 FALSE   FALSE
## 3   V03  6607   6607     0   0 FALSE   FALSE
## 4   V04     1      1     0   0 FALSE   FALSE
## 5   V05  6607   6607     0   0 FALSE   FALSE
## 6   V06  6607   6607     0   0 FALSE   FALSE
## 7   V07     1      1     0   0 FALSE   FALSE
## 8   V08  6607   6607     0   0 FALSE   FALSE
## 9   V09     1      1     0   0 FALSE   FALSE
## 10  V10  6607   6607     0   0 FALSE   FALSE
## 11  V11     1      1     0   0 FALSE   FALSE
## 12  V12  6607   6607     0   0 FALSE   FALSE
## 13  V13     1      1     0   0 FALSE   FALSE
## 14  V14  6607   6257     0 350 FALSE   FALSE
## 15  V15  6607   6257     0 350 FALSE   FALSE
## 16  V16     1      1     0   0 FALSE   FALSE
## 17  V17  6607   6607     0   0 FALSE   FALSE
## 18  V18  6607   6607     0   0 FALSE   FALSE
## 19  V19     1      1     0   0 FALSE   FALSE
## 20  V20  6607   6607     0   0 FALSE   FALSE
## 21  V21     1      1     0   0 FALSE   FALSE
## 22  V22  6607   6607     0   0 FALSE   FALSE
## 23  V23     1      1     0   0 FALSE   FALSE
## 24  V24  6607   6607     0   0 FALSE   FALSE
## 25  V25  6607   6607     0   0 FALSE   FALSE
## 26  V26     1      1     0   0 FALSE   FALSE
## 27  V27  6607   6257     0 350 FALSE   FALSE
## 28  V28     1      1     0   0 FALSE   FALSE
## 29  V29  6607   6529     0  78 FALSE   FALSE
## 30  V30     1      1     0   0 FALSE   FALSE
## 31  V31  6607   6607     0   0 FALSE   FALSE
## 32  V32     1      1     0   0 FALSE   FALSE
## 33  V33  6607   6607     0   0 FALSE   FALSE
## 34  V34     1      1     0   0 FALSE   FALSE
## 35  V35  6607   6607     0   0 FALSE   FALSE
## 36  V36  6607   6607     0   0 FALSE   FALSE
## 37  V37     1      1     0   0 FALSE   FALSE
## 38  V38  6607   6607     0   0 FALSE   FALSE
## 39  V39     1      1     0   0 FALSE   FALSE
## 40  V40  6607   6517     0  90 FALSE   FALSE
## 41  V41     1      1     0   0 FALSE   FALSE
## 42  V42  6607   6540     0  67 FALSE   FALSE
## 43  V43     1      1     0   0 FALSE   FALSE
## 44  V44  6607   6607     0   0 FALSE   FALSE
## 45  V45     1      1     0   0 FALSE   FALSE
## 46  V46  6607   6307     0 300 FALSE   FALSE
## 47  V47  6607   6306     1 300 FALSE   FALSE
##                                                                    expression
## 1                                                   is.numeric(Hours_Studied)
## 2                                                 Hours_Studied - 0 >= -1e-08
## 3                                                Hours_Studied - 168 <= 1e-08
## 4                                                      is.numeric(Attendance)
## 5                                                    Attendance - 0 >= -1e-08
## 6                                                   Attendance - 100 <= 1e-08
## 7                                             is.factor(Parental_Involvement)
## 8                       Parental_Involvement %vin% c("Low", "Medium", "High")
## 9                                              is.factor(Access_to_Resources)
## 10                       Access_to_Resources %vin% c("Low", "Medium", "High")
## 11                                      is.factor(Extracurricular_Activities)
## 12                            Extracurricular_Activities %vin% c("No", "Yes")
## 13                                                    is.numeric(Sleep_Hours)
## 14                                                  Sleep_Hours - 0 >= -1e-08
## 15                                                  Sleep_Hours - 24 <= 1e-08
## 16                                                is.numeric(Previous_Scores)
## 17                                              Previous_Scores - 0 >= -1e-08
## 18                                             Previous_Scores - 100 <= 1e-08
## 19                                                is.factor(Motivation_Level)
## 20                          Motivation_Level %vin% c("Low", "Medium", "High")
## 21                                                 is.factor(Internet_Access)
## 22                                       Internet_Access %vin% c("No", "Yes")
## 23                                              is.numeric(Tutoring_Sessions)
## 24                                            Tutoring_Sessions - 0 >= -1e-08
## 25                        (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0
## 26                                                   is.factor(Family_Income)
## 27                             Family_Income %vin% c("Low", "Medium", "High")
## 28                                                 is.factor(Teacher_Quality)
## 29                           Teacher_Quality %vin% c("Low", "Medium", "High")
## 30                                                     is.factor(School_Type)
## 31                                   School_Type %vin% c("Public", "Private")
## 32                                                  is.factor(Peer_Influence)
## 33                  Peer_Influence %vin% c("Negative", "Neutral", "Positive")
## 34                                              is.numeric(Physical_Activity)
## 35                                            Physical_Activity - 0 >= -1e-08
## 36                                           Physical_Activity - 168 <= 1e-08
## 37                                           is.factor(Learning_Disabilities)
## 38                                 Learning_Disabilities %vin% c("No", "Yes")
## 39                                        is.factor(Parental_Education_Level)
## 40 Parental_Education_Level %vin% c("High School", "College", "Postgraduate")
## 41                                              is.factor(Distance_from_Home)
## 42                      Distance_from_Home %vin% c("Far", "Moderate", "Near")
## 43                                                          is.factor(Gender)
## 44                                           Gender %vin% c("Female", "Male")
## 45                                                     is.numeric(Exam_Score)
## 46                                                   Exam_Score - 0 >= -1e-08
## 47                                                  Exam_Score - 100 <= 1e-08

Istnieje jedna obserwacja, w której jedna zmienna wykracza poza swój dozwolony przedział.

dane %>%
  filter(!(Exam_Score >= 0 & Exam_Score <= 100)) %>%
  select(Exam_Score)
## # A tibble: 1 × 1
##   Exam_Score
##        <dbl>
## 1        101

W jednej obserwacji wynik z egzaminu (zmienna Exam_Score) został wprowadzony jako 101, mimo że wynik może wynosić maksymalnie 100. To najprawdopodobniej błąd przy wprowadzaniu danych, dlatego ta wartość zostanie zmieniona na 100.

dane$Exam_Score <- ifelse(dane$Exam_Score > 100, 100, dane$Exam_Score)

Poza tym nie ma żadnych innych obserwacji, które nie spełniają którejś z reguł walidacyjnych.

1.2.3. Imputacje braków danych

1.2.3.1. Badanie braków danych

na_count <- sum(!complete.cases(dane))
na_count
## [1] 1141
na_count / nrow(dane)
## [1] 0.1726956

W zestawie danych łącznie 1141 obserwacji posiada braki danych, co stanowi około 17%. Jest to bardzo dużo. Można sprawdzić, w których konkretnie kolumnach występują braki danych.

for(i in 1:ncol(dane)) {
  cat("Liczba braków danych w kolumnie", names(dane[, i]), ":", sum(is.na(dane[ , i])), "\n")
}
## Liczba braków danych w kolumnie Hours_Studied : 0 
## Liczba braków danych w kolumnie Attendance : 0 
## Liczba braków danych w kolumnie Parental_Involvement : 0 
## Liczba braków danych w kolumnie Access_to_Resources : 0 
## Liczba braków danych w kolumnie Extracurricular_Activities : 0 
## Liczba braków danych w kolumnie Sleep_Hours : 350 
## Liczba braków danych w kolumnie Previous_Scores : 0 
## Liczba braków danych w kolumnie Motivation_Level : 0 
## Liczba braków danych w kolumnie Internet_Access : 0 
## Liczba braków danych w kolumnie Tutoring_Sessions : 0 
## Liczba braków danych w kolumnie Family_Income : 350 
## Liczba braków danych w kolumnie Teacher_Quality : 78 
## Liczba braków danych w kolumnie School_Type : 0 
## Liczba braków danych w kolumnie Peer_Influence : 0 
## Liczba braków danych w kolumnie Physical_Activity : 0 
## Liczba braków danych w kolumnie Learning_Disabilities : 0 
## Liczba braków danych w kolumnie Parental_Education_Level : 90 
## Liczba braków danych w kolumnie Distance_from_Home : 67 
## Liczba braków danych w kolumnie Gender : 0 
## Liczba braków danych w kolumnie Exam_Score : 300

1.2.3.2. Imputacje

Zestaw posiada wiele braków danych, dlatego konieczne będzie dokonanie ich imputacji. Wszystkie zmienne zostały zimputowane za pomocą metody MICE, czyli wielowymiarowego wypełniania przez równania łańcuchowe.

# Imputacja zmiennej Sleep_Hours

imp1 <- imputate_na(dane, Sleep_Hours, Hours_Studied,
                    method = "mice", seed = 101)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp1)

# Imputacja zmiennej Family_Income

imp2 <- imputate_na(dane, Family_Income, Extracurricular_Activities,
                    method = "mice", seed = 102)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp2)

# Imputacja zmiennej Teacher_Quality

imp3 <- imputate_na(dane, Teacher_Quality, Previous_Scores,
                    method = "mice", seed = 103)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp3)

# Imputacja zmiennej Parental_Education_Level

imp4 <- imputate_na(dane, Parental_Education_Level, Family_Income,
                    method = "mice", seed = 104)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp4)

# Imputacja zmiennej Distance_from_Home

imp5 <- imputate_na(dane, Distance_from_Home, Sleep_Hours,
                    method = "mice", seed = 105)
## 
##  iter imp variable
##   1   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp5)

# Imputacja zmiennej Exam_Score

imp6 <- imputate_na(dane, Exam_Score, Previous_Scores,
                    method = "mice", seed = 106)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
plot(imp6)

Jak widać na wykresach, metoda MICE zapewnia dobre dopasowanie do zestawu danych. Zatem można wprowadzić imputacje do zestawu danych.

# Imputacja zmiennej Sleep_Hours

dane$Sleep_Hours <- imputate_na(dane, Sleep_Hours, Hours_Studied,
                                method = "mice", seed = 101, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Sleep_Hours  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
# Imputacja zmiennej Family_Income

dane$Family_Income <- imputate_na(dane, Family_Income, Extracurricular_Activities,
                                  method = "mice", seed = 102, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Family_Income  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
# Imputacja zmiennej Teacher_Quality

dane$Teacher_Quality <- imputate_na(dane, Teacher_Quality, Previous_Scores,
                                    method = "mice", seed = 103, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Teacher_Quality  Parental_Education_Level  Distance_from_Home  Exam_Score
# Imputacja zmiennej Parental_Education_Level

dane$Parental_Education_Level <- imputate_na(dane, Parental_Education_Level, Family_Income,
                                             method = "mice", seed = 104, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   2  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   3  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   4  Parental_Education_Level  Distance_from_Home  Exam_Score
##   1   5  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   1  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   2  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   3  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   4  Parental_Education_Level  Distance_from_Home  Exam_Score
##   2   5  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   1  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   2  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   3  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   4  Parental_Education_Level  Distance_from_Home  Exam_Score
##   3   5  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   1  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   2  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   3  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   4  Parental_Education_Level  Distance_from_Home  Exam_Score
##   4   5  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   1  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   2  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   3  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   4  Parental_Education_Level  Distance_from_Home  Exam_Score
##   5   5  Parental_Education_Level  Distance_from_Home  Exam_Score
# Imputacja zmiennej Distance_from_Home

dane$Distance_from_Home <- imputate_na(dane, Distance_from_Home, Sleep_Hours,
                                       method = "mice", seed = 105, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Distance_from_Home  Exam_Score
##   1   2  Distance_from_Home  Exam_Score
##   1   3  Distance_from_Home  Exam_Score
##   1   4  Distance_from_Home  Exam_Score
##   1   5  Distance_from_Home  Exam_Score
##   2   1  Distance_from_Home  Exam_Score
##   2   2  Distance_from_Home  Exam_Score
##   2   3  Distance_from_Home  Exam_Score
##   2   4  Distance_from_Home  Exam_Score
##   2   5  Distance_from_Home  Exam_Score
##   3   1  Distance_from_Home  Exam_Score
##   3   2  Distance_from_Home  Exam_Score
##   3   3  Distance_from_Home  Exam_Score
##   3   4  Distance_from_Home  Exam_Score
##   3   5  Distance_from_Home  Exam_Score
##   4   1  Distance_from_Home  Exam_Score
##   4   2  Distance_from_Home  Exam_Score
##   4   3  Distance_from_Home  Exam_Score
##   4   4  Distance_from_Home  Exam_Score
##   4   5  Distance_from_Home  Exam_Score
##   5   1  Distance_from_Home  Exam_Score
##   5   2  Distance_from_Home  Exam_Score
##   5   3  Distance_from_Home  Exam_Score
##   5   4  Distance_from_Home  Exam_Score
##   5   5  Distance_from_Home  Exam_Score
# Imputacja zmiennej Exam_Score

dane$Exam_Score <- imputate_na(dane, Exam_Score, Previous_Scores,
                               method = "mice", seed = 106, no_attrs = TRUE)
## 
##  iter imp variable
##   1   1  Exam_Score
##   1   2  Exam_Score
##   1   3  Exam_Score
##   1   4  Exam_Score
##   1   5  Exam_Score
##   2   1  Exam_Score
##   2   2  Exam_Score
##   2   3  Exam_Score
##   2   4  Exam_Score
##   2   5  Exam_Score
##   3   1  Exam_Score
##   3   2  Exam_Score
##   3   3  Exam_Score
##   3   4  Exam_Score
##   3   5  Exam_Score
##   4   1  Exam_Score
##   4   2  Exam_Score
##   4   3  Exam_Score
##   4   4  Exam_Score
##   4   5  Exam_Score
##   5   1  Exam_Score
##   5   2  Exam_Score
##   5   3  Exam_Score
##   5   4  Exam_Score
##   5   5  Exam_Score

Po wykonaniu tych imputacji usunięto wszystkie braki danych.

for(i in 1:ncol(dane)) {
  cat("Liczba braków danych w kolumnie", names(dane[, i]), ":", sum(is.na(dane[ , i])), "\n")
}
## Liczba braków danych w kolumnie Hours_Studied : 0 
## Liczba braków danych w kolumnie Attendance : 0 
## Liczba braków danych w kolumnie Parental_Involvement : 0 
## Liczba braków danych w kolumnie Access_to_Resources : 0 
## Liczba braków danych w kolumnie Extracurricular_Activities : 0 
## Liczba braków danych w kolumnie Sleep_Hours : 0 
## Liczba braków danych w kolumnie Previous_Scores : 0 
## Liczba braków danych w kolumnie Motivation_Level : 0 
## Liczba braków danych w kolumnie Internet_Access : 0 
## Liczba braków danych w kolumnie Tutoring_Sessions : 0 
## Liczba braków danych w kolumnie Family_Income : 0 
## Liczba braków danych w kolumnie Teacher_Quality : 0 
## Liczba braków danych w kolumnie School_Type : 0 
## Liczba braków danych w kolumnie Peer_Influence : 0 
## Liczba braków danych w kolumnie Physical_Activity : 0 
## Liczba braków danych w kolumnie Learning_Disabilities : 0 
## Liczba braków danych w kolumnie Parental_Education_Level : 0 
## Liczba braków danych w kolumnie Distance_from_Home : 0 
## Liczba braków danych w kolumnie Gender : 0 
## Liczba braków danych w kolumnie Exam_Score : 0

1.2.3.3. Walidacja imputacji

Należy sprawdzić czy po imputacji danych wciąż spełniają one reguły walidacji.

rules <- check_that(dane,
  
  # Reguły dla zmiennej Hours_Studied
  
  is.numeric(Hours_Studied), #1
  Hours_Studied >= 0, #2
  Hours_Studied <= 168, #3
  
  # Reguły dla zmiennej Attendance
  
  is.numeric(Attendance), #4
  Attendance >= 0, #5
  Attendance <= 100, #6
  
  # Reguły dla zmiennej Parental_Involvement
  
  is.factor(Parental_Involvement), #7
  Parental_Involvement %in% c("Low", "Medium", "High"), #8
  
  # Reguły dla zmiennej Access_to_Resources
  
  is.factor(Access_to_Resources), #9
  Access_to_Resources %in% c("Low", "Medium", "High"), #10
  
  # Reguły dla zmiennej Extracurricular_Activities
  
  is.factor(Extracurricular_Activities), #11
  Extracurricular_Activities %in% c("No", "Yes"), #12
  
  # Reguły dla zmiennej Sleep_Hours
  
  is.numeric(Sleep_Hours), #13
  Sleep_Hours >= 0, #14
  Sleep_Hours <= 24, #15
  
  # Reguły dla zmiennej Previous_Scores
  
  is.numeric(Previous_Scores), #16
  Previous_Scores >= 0, #17
  Previous_Scores <= 100, #18
  
  # Reguły dla zmiennej Motivation_Level
  
  is.factor(Motivation_Level), #19
  Motivation_Level %in% c("Low", "Medium", "High"), #20
  
  # Reguły dla zmiennej Internet_Access
  
  is.factor(Internet_Access), #21
  Internet_Access %in% c("No", "Yes"), #22
  
  # Reguły dla zmiennej Tutoring_Sessions
  
  is.numeric(Tutoring_Sessions), #23
  Tutoring_Sessions >= 0, #24
  (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0, #25
  
  # Reguły dla zmiennej Family_Income
  
  is.factor(Family_Income), #26
  Family_Income %in% c("Low", "Medium", "High"), #27
  
  # Reguły dla zmiennej Teacher_Quality
  
  is.factor(Teacher_Quality), #28
  Teacher_Quality %in% c("Low", "Medium", "High"), #29
  
  # Reguły dla zmiennej School_Type
  
  is.factor(School_Type), #30
  School_Type %in% c("Public", "Private"), #31
  
  # Reguły dla zmiennej Peer_Influence
  
  is.factor(Peer_Influence), #32
  Peer_Influence %in% c("Negative", "Neutral", "Positive"), #33
  
  # Reguły dla zmiennej Physical_Activity
  
  is.numeric(Physical_Activity), #34
  Physical_Activity >= 0, #35
  Physical_Activity <= 168, #36
  
  # Reguły dla zmiennej Learning_Disabilities
  
  is.factor(Learning_Disabilities), #37
  Learning_Disabilities %in% c("No", "Yes"), #38
  
  # Reguły dla zmiennej Parental_Education_Level
  
  is.factor(Parental_Education_Level), #39
  Parental_Education_Level %in% c("High School", "College", "Postgraduate"), #40
  
  # Reguły dla zmiennej Distance_from_Home
  
  is.factor(Distance_from_Home), #41
  Distance_from_Home %in% c("Far", "Moderate", "Near"), #42
  
  # Reguły dla zmiennej Gender
  
  is.factor(Gender), #43
  Gender %in% c("Female", "Male"), #44
  
  # Reguły dla zmiennej Exam_Score
  
  is.numeric(Exam_Score), #45
  Exam_Score >= 0, #46
  Exam_Score <= 100 #47
)

summary(rules)
##    name items passes fails nNA error warning
## 1   V01     1      1     0   0 FALSE   FALSE
## 2   V02  6607   6607     0   0 FALSE   FALSE
## 3   V03  6607   6607     0   0 FALSE   FALSE
## 4   V04     1      1     0   0 FALSE   FALSE
## 5   V05  6607   6607     0   0 FALSE   FALSE
## 6   V06  6607   6607     0   0 FALSE   FALSE
## 7   V07     1      1     0   0 FALSE   FALSE
## 8   V08  6607   6607     0   0 FALSE   FALSE
## 9   V09     1      1     0   0 FALSE   FALSE
## 10  V10  6607   6607     0   0 FALSE   FALSE
## 11  V11     1      1     0   0 FALSE   FALSE
## 12  V12  6607   6607     0   0 FALSE   FALSE
## 13  V13     1      1     0   0 FALSE   FALSE
## 14  V14  6607   6607     0   0 FALSE   FALSE
## 15  V15  6607   6607     0   0 FALSE   FALSE
## 16  V16     1      1     0   0 FALSE   FALSE
## 17  V17  6607   6607     0   0 FALSE   FALSE
## 18  V18  6607   6607     0   0 FALSE   FALSE
## 19  V19     1      1     0   0 FALSE   FALSE
## 20  V20  6607   6607     0   0 FALSE   FALSE
## 21  V21     1      1     0   0 FALSE   FALSE
## 22  V22  6607   6607     0   0 FALSE   FALSE
## 23  V23     1      1     0   0 FALSE   FALSE
## 24  V24  6607   6607     0   0 FALSE   FALSE
## 25  V25  6607   6607     0   0 FALSE   FALSE
## 26  V26     1      1     0   0 FALSE   FALSE
## 27  V27  6607   6607     0   0 FALSE   FALSE
## 28  V28     1      1     0   0 FALSE   FALSE
## 29  V29  6607   6607     0   0 FALSE   FALSE
## 30  V30     1      1     0   0 FALSE   FALSE
## 31  V31  6607   6607     0   0 FALSE   FALSE
## 32  V32     1      1     0   0 FALSE   FALSE
## 33  V33  6607   6607     0   0 FALSE   FALSE
## 34  V34     1      1     0   0 FALSE   FALSE
## 35  V35  6607   6607     0   0 FALSE   FALSE
## 36  V36  6607   6607     0   0 FALSE   FALSE
## 37  V37     1      1     0   0 FALSE   FALSE
## 38  V38  6607   6607     0   0 FALSE   FALSE
## 39  V39     1      1     0   0 FALSE   FALSE
## 40  V40  6607   6607     0   0 FALSE   FALSE
## 41  V41     1      1     0   0 FALSE   FALSE
## 42  V42  6607   6607     0   0 FALSE   FALSE
## 43  V43     1      1     0   0 FALSE   FALSE
## 44  V44  6607   6607     0   0 FALSE   FALSE
## 45  V45     1      1     0   0 FALSE   FALSE
## 46  V46  6607   6607     0   0 FALSE   FALSE
## 47  V47  6607   6607     0   0 FALSE   FALSE
##                                                                    expression
## 1                                                   is.numeric(Hours_Studied)
## 2                                                 Hours_Studied - 0 >= -1e-08
## 3                                                Hours_Studied - 168 <= 1e-08
## 4                                                      is.numeric(Attendance)
## 5                                                    Attendance - 0 >= -1e-08
## 6                                                   Attendance - 100 <= 1e-08
## 7                                             is.factor(Parental_Involvement)
## 8                       Parental_Involvement %vin% c("Low", "Medium", "High")
## 9                                              is.factor(Access_to_Resources)
## 10                       Access_to_Resources %vin% c("Low", "Medium", "High")
## 11                                      is.factor(Extracurricular_Activities)
## 12                            Extracurricular_Activities %vin% c("No", "Yes")
## 13                                                    is.numeric(Sleep_Hours)
## 14                                                  Sleep_Hours - 0 >= -1e-08
## 15                                                  Sleep_Hours - 24 <= 1e-08
## 16                                                is.numeric(Previous_Scores)
## 17                                              Previous_Scores - 0 >= -1e-08
## 18                                             Previous_Scores - 100 <= 1e-08
## 19                                                is.factor(Motivation_Level)
## 20                          Motivation_Level %vin% c("Low", "Medium", "High")
## 21                                                 is.factor(Internet_Access)
## 22                                       Internet_Access %vin% c("No", "Yes")
## 23                                              is.numeric(Tutoring_Sessions)
## 24                                            Tutoring_Sessions - 0 >= -1e-08
## 25                        (Tutoring_Sessions - floor(Tutoring_Sessions)) == 0
## 26                                                   is.factor(Family_Income)
## 27                             Family_Income %vin% c("Low", "Medium", "High")
## 28                                                 is.factor(Teacher_Quality)
## 29                           Teacher_Quality %vin% c("Low", "Medium", "High")
## 30                                                     is.factor(School_Type)
## 31                                   School_Type %vin% c("Public", "Private")
## 32                                                  is.factor(Peer_Influence)
## 33                  Peer_Influence %vin% c("Negative", "Neutral", "Positive")
## 34                                              is.numeric(Physical_Activity)
## 35                                            Physical_Activity - 0 >= -1e-08
## 36                                           Physical_Activity - 168 <= 1e-08
## 37                                           is.factor(Learning_Disabilities)
## 38                                 Learning_Disabilities %vin% c("No", "Yes")
## 39                                        is.factor(Parental_Education_Level)
## 40 Parental_Education_Level %vin% c("High School", "College", "Postgraduate")
## 41                                              is.factor(Distance_from_Home)
## 42                      Distance_from_Home %vin% c("Far", "Moderate", "Near")
## 43                                                          is.factor(Gender)
## 44                                           Gender %vin% c("Female", "Male")
## 45                                                     is.numeric(Exam_Score)
## 46                                                   Exam_Score - 0 >= -1e-08
## 47                                                  Exam_Score - 100 <= 1e-08

Wszystkie obserwacje spełniają reguły walidacji, więc można przejść do kolejnego etapu projektu.

2. Wizualizacje danych

W tym rozdziale przedstawione zostały różne formy wizualizacji danych. Wizualizacje oparte są na pakiecie ggplot2 oraz plotly. Przed stworzeniem wizualizacji zdefiniowano motyw, który będzie wykorzystywany we wszystkich wykresach, w celu ujednolicenia stylu.

my_theme <- theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
        axis.title = element_text(size = 12),
        axis.text = element_text(size = 11))

2.1. Wykresy pudełkowe

W tym podrozdziale przedstawiono wykresy pudełkowe dla zmiennych ilościowych zestawu danych. Najpierw zostały zdefiniowane poniższym kodem.

# Wykres pudełkowy godzin nauki

wykres1 <- ggplot(dane, aes(y = Hours_Studied)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy godzin nauki",
       y = "Godziny nauki") +
  my_theme

# Wykres pudełkowy wyników z egzaminu

wykres2 <- ggplot(dane, aes(y = Exam_Score)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy wyników z egzaminu",
       y = "Wynik z egzaminu [%]") +
  my_theme

# Wykres pudełkowy obecności

wykres3 <- ggplot(dane, aes(y = Attendance)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy obecności",
       y = "Obecność [%]") +
  my_theme

# Wykres pudełkowy średniej liczby godzin snu w ciągu nocy

wykres4 <- ggplot(dane, aes(y = Sleep_Hours)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy średniej liczby godzin snu w ciągu nocy",
       y = "Średnia liczba godzin snu w ciągu nocy") +
  my_theme

# Wykres pudełkowy wyników z poprzednich egzaminów

wykres5 <- ggplot(dane, aes(y = Previous_Scores)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy wyników z poprzednich egzaminów",
       y = "Wyniki z poprzednich egzaminów [%]") +
  my_theme

# Wykres pudełkowy liczby sesji korepetycji w miesiącu

wykres6 <- ggplot(dane, aes(y = Tutoring_Sessions)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy liczby sesji korepetycji w miesiącu",
       y = "Liczba sesji korepetycji w miesiącu") +
  my_theme

# Wykres pudełkowy średniej liczby godzin aktywności fizycznej w tygodniu

wykres7 <- ggplot(dane, aes(y = Physical_Activity)) +
  geom_boxplot() +
  labs(title = "Wykres pudełkowy średniej liczby godzin aktywności fizycznej w tygodniu",
       y = "Średnia liczba godzin aktywności fizycznej w tygodniu") +
  my_theme

Następnie przetworzono je do formy interaktywnej za pomocą pakietu plotly.

ggplotly(wykres1)
ggplotly(wykres2)
ggplotly(wykres3)
ggplotly(wykres4)
ggplotly(wykres5)
ggplotly(wykres6)
ggplotly(wykres7)

2.2. Histogramy

W tym podrozdziale przedstawione zostały rozkłady zmiennych ilościowych za pomocą histogramów. Najpierw wykresy zostaną zdefiniowane, a następnie zwizualizowane za pomocą pakietu plotly.

# Histogram godzin nauki w tygodniu

wykres8 <- ggplot(dane, aes(x = Hours_Studied)) +
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histogram godzin nauki w tygodniu", 
       x = "Liczba godzin nauki", 
       y = "Liczba osób") +
  my_theme


# Histogram obecności na zajęciach

wykres9 <- ggplot(dane, aes(x = Attendance)) +
  geom_histogram(binwidth = 5, fill = "red", color = "black", alpha = 0.7) +
  labs(title = "Histogram obecności na zajęciach", 
       x = "Obecność [%]", 
       y = "Liczba osób") +
  my_theme

# Histogram średniej liczby godzin snu w ciągu nocy

wykres10 <- ggplot(dane, aes(x = Sleep_Hours)) +
  geom_histogram(binwidth = 1, fill = "pink", color = "black", alpha = 0.7) +
  labs(title = "Histogram średniej liczby godzin snu w ciągu nocy", 
       x = "Liczba godzin snu", 
       y = "Liczba osób") +
  my_theme

# Histogram wyników z poprzednich egzaminów

wykres11 <- ggplot(dane, aes(x = Previous_Scores)) +
  geom_histogram(binwidth = 5, fill = "green", color = "black", alpha = 0.7) +
  labs(title = "Histogram wyników z poprzednich egzaminów", 
       x = "Wyniki [%]", 
       y = "Liczba osób") +
  my_theme

# Histogram liczby sesji korepetycji w miesiącu

wykres12 <- ggplot(dane, aes(x = Tutoring_Sessions)) +
  geom_histogram(binwidth = 1, fill = "purple", color = "black", alpha = 0.7) +
  labs(title = "Histogram liczby sesji korepetycji w miesiącu", 
       x = "Liczba sesji", 
       y = "Liczba osób") +
  my_theme

# Histogram średniej liczby godzin aktywności fizycznej w tygodniu

wykres13 <- ggplot(dane, aes(x = Physical_Activity)) +
  geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histogram średniej liczby godzin aktywności fizycznej w tygodniu", 
       x = "Liczba godzin", 
       y = "Liczba osób") +
  my_theme

# Histogram wyników z egzaminu

wykres14 <- ggplot(dane, aes(x = Exam_Score)) +
  geom_histogram(binwidth = 5, fill = "brown", color = "black", alpha = 0.7) +
  labs(title = "Histogram wyników z egzaminu", 
       x = "Wynik [%]", 
       y = "Liczba osób") +
  my_theme
ggplotly(wykres8)
ggplotly(wykres9)
ggplotly(wykres10)
ggplotly(wykres11)
ggplotly(wykres12)
ggplotly(wykres13)
ggplotly(wykres14)

2.3. Wykresy kolumnowe

W tym podrozdziale przedstawiono wykresy kolumnowe dla zmiennych jakościowych. Ponownie w pierwszej kolejności zostaną one zdefiniowane, a następnie zwizualizowane w interaktywny sposób.

# parental involvement - wykres

wykres15 <- ggplot(dane, aes(x = Parental_Involvement, fill = Parental_Involvement)) +
  geom_bar(color = "black") +
  labs(title = "Zaangażowanie rodziców", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# access to resources - wykres

wykres16 <- ggplot(dane, aes(x = Access_to_Resources, fill = Access_to_Resources)) +
  geom_bar(color = "black") +
  labs(title = "Dostęp do zasobów", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# extracurricular activities - wykres

wykres17 <- ggplot(dane, aes(x = Extracurricular_Activities,
                             fill = Extracurricular_Activities)) +
  geom_bar(color = "black") +
  labs(title = "Udział w zajęciach pozalekcyjnych", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# motivation level - wykres

wykres18 <- ggplot(dane, aes(x = Motivation_Level, fill = Motivation_Level)) +
  geom_bar(color = "black") +
  labs(title = "Poziom motywacji", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# internet access - wykres

wykres19 <- ggplot(dane, aes(x = Internet_Access, fill = Internet_Access)) +
  geom_bar(color = "black") +
  labs(title = "Dostęp do internetu", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# family income - wykres

wykres20 <- ggplot(dane, aes(x = Family_Income, fill = Family_Income)) +
  geom_bar(color = "black") +
  labs(title = "Dochód rodziny", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# teacher quality - wykres

wykres21 <- ggplot(dane, aes(x = Teacher_Quality, fill = Teacher_Quality)) +
  geom_bar(color = "black") +
  labs(title = "Jakość nauczania", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# school type - wykres

wykres22 <- ggplot(dane, aes(x = School_Type, fill = School_Type)) +
  geom_bar(color = "black") +
  labs(title = "Rodzaj szkoły", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# peer influence - wykres

wykres23 <- ggplot(dane, aes(x = Peer_Influence, fill = Peer_Influence)) +
  geom_bar(color = "black") +
  labs(title = "Wpływ rówieśników", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# learning disabilities - wykres

wykres24 <- ggplot(dane, aes(x = Learning_Disabilities, fill = Learning_Disabilities)) +
  geom_bar(color = "black") +
  labs(title = "Występowanie trudności w uczeniu się", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# parental education level - wykres

wykres25 <- ggplot(dane, aes(x = Parental_Education_Level, fill = Parental_Education_Level)) +
  geom_bar(color = "black") +
  labs(title = "Poziom wykształcenia rodziców", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# distance from home - wykres

wykres26 <- ggplot(dane, aes(x = Distance_from_Home, fill = Distance_from_Home)) +
  geom_bar(color = "black") +
  labs(title = "Odległość od domu", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")

# gender - wykres

wykres27 <- ggplot(dane, aes(x = Gender, fill = Gender)) +
  geom_bar(color = "black") +
  labs(title = "Płeć", x = NULL, y = "Liczba wystąpień") +
  my_theme + theme(legend.position = "none")
ggplotly(wykres15)
ggplotly(wykres16)
ggplotly(wykres17)
ggplotly(wykres18)
ggplotly(wykres19)
ggplotly(wykres20)
ggplotly(wykres21)
ggplotly(wykres22)
ggplotly(wykres23)
ggplotly(wykres24)
ggplotly(wykres25)
ggplotly(wykres26)
ggplotly(wykres27)

2.4. Wykresy punktowe

Jako ostatnie przedstawiono wykresy punktowe. Każdorazowo przedstawiają one zależność między jedną zmienną a wynikami z egzaminu (Exam_Score). Procedura jest taka sama jak w poprzednich podrozdziałach.

wykres28 <- ggplot(dane, aes(x = Hours_Studied, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "red") +
  labs(title = "Wynik egzaminu w zależności od liczby godzin spędzonych na nauce",
       x = "Liczba godzin nauki [h]",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres29 <- ggplot(dane, aes(x = Attendance, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "black") +
  labs(title = "Wynik egzaminu w zależności od obecności",
       x = "Obecność [%]",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres30 <- ggplot(dane, aes(x = Parental_Involvement, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "purple") +
  labs(title = "Wynik egzaminu w zależności od zaangażowania rodziców",
       x = "Zaangażowanie rodziców",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres31 <- ggplot(dane, aes(x = Access_to_Resources, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "grey") +
  labs(title = "Wynik egzaminu w zależności od od dostępu do zasobów naukowych",
       x = "Dostęp do zasobów",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres32 <- ggplot(dane, aes(x = Extracurricular_Activities, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "pink") +
  labs(title = "Wynik egzaminu w zależności od liczby zajęć pozalekcyjnych",
       x = "Zajęcia pozalekcyjne",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres33 <- ggplot(dane, aes(x = Sleep_Hours, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "blue") +
  labs(title = "Wynik egzaminu w zależności od liczby godzin snu",
       x = "Liczba godzin snu [h]",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres34 <- ggplot(dane, aes(x = Previous_Scores, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "green") +
  labs(title = "Wynik egzaminu w zależności od poprzednich wyników z egzaminu",
       x = "Poprzednie wyniki z egzaminu [%]",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres35 <- ggplot(dane, aes(x = Motivation_Level, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "yellow") +
  labs(title = "Wynik egzaminu w zależności od poziomu motywacji",
       x = "Poziom motywacji",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres36 <- ggplot(dane, aes(x = Internet_Access, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "brown") +
  labs(title = "Wynik egzaminu w zależności od dostępu do internetu",
       x = "Dostęp do internetu",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres37 <- ggplot(dane, aes(x = Tutoring_Sessions, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "orange") +
  labs(title = "Wynik egzaminu w zależności od ilości korepetycji",
       x = "Ilość korepetycji",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres38 <- ggplot(dane, aes(x = Family_Income, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "lightblue") +
  labs(title = "Wynik egzaminu w zależności od zarobku rodziny",
       x = "Zarobek rodziny",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres39 <- ggplot(dane, aes(x = Teacher_Quality, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "lightgreen") +
  labs(title = "Wynik egzaminu w zależności od jakości kształcenia",
       x = "Jakość kształcenia",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres40 <- ggplot(dane, aes(x = School_Type, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "darkgreen") +
  labs(title = "Wynik egzaminu w zależności od wybranego rodzaju szkoły",
       x = "Rodzaj szkoły",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres41 <- ggplot(dane, aes(x = Peer_Influence, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "darkred") +
  labs(title = "Wynik egzaminu w zależności od wpływu rówieśników",
       x = "Wpływ rówieśników",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres42 <- ggplot(dane, aes(x = Physical_Activity, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "darkblue") +
  labs(title = "Wynik egzaminu w zależności od liczby godzin spędzonych na aktywności fizycznej",
       x = "Aktywność fizyczna [h]",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres43 <- ggplot(dane, aes(x = Learning_Disabilities, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "darkorange") +
  labs(title = "Wynik egzaminu w zależności od niepełnosprawności",
       x = "Niepełnosprawność",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres44 <- ggplot(dane, aes(x = Parental_Education_Level, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "lightpink") +
  labs(title = "Wynik egzaminu w zależności od wykształcenia rodziców",
       x = "Wykształcenie rodziców",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres45 <- ggplot(dane, aes(x = Distance_from_Home, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "lightgrey") +
  labs(title = "Wynik egzaminu w zależności od odległości od domu",
       x = "Odległość od domu",
       y = "Wynik z egzaminu [%]") +
  my_theme

wykres46 <- ggplot(dane, aes(x = Gender, y = Exam_Score)) +
  geom_point(size = 3, alpha = 0.1, colour = "darkgrey") +
  labs(title = "Wynik egzaminu w zależności od płci",
       x = "Płeć",
       y = "Wynik z egzaminu [%]") +
  my_theme
ggplotly(wykres28)
ggplotly(wykres29)
ggplotly(wykres30)
ggplotly(wykres31)
ggplotly(wykres32)
ggplotly(wykres33)
ggplotly(wykres34)
ggplotly(wykres35)
ggplotly(wykres36)
ggplotly(wykres37)
ggplotly(wykres38)
ggplotly(wykres39)
ggplotly(wykres40)
ggplotly(wykres41)
ggplotly(wykres42)
ggplotly(wykres43)
ggplotly(wykres44)
ggplotly(wykres45)
ggplotly(wykres46)

3. Analiza opisowa

Kolejnym etapem projektu było wykonanie analizy opisowej danych. W tym celu obliczono statystyki opisowe dla zmiennych ilościowych i korelacje dla zmiennych ilościowych oraz jakościowych.

3.1. Statystyki opisowe

Poniżej przedstawiono statystyki opisowe dla zmmiennych ilościowych. Obliczone zostały: średnia arytmetyczna, odchylenie standardowe, rozstęp międzykwartylowy, współczynnik zmienności, skośność, kurtoza oraz wszystkie kwartyle, w tym mediana.

stat_opisowe <- dane %>%
  select(where(is.numeric)) %>%
  numSummary(statistics = c("mean", "sd", "IQR", "CV", "quantiles",
                            "skewness", "kurtosis"))
## Warning in CV(X): not all values are positive
round(stat_opisowe$table, 3)
##                     mean     sd IQR    CV skewness kurtosis 0% 25% 50% 75% 100%
## Hours_Studied     19.975  5.991   8 0.300    0.013    0.018  1  16  20  24   44
## Attendance        79.977 11.547  20 0.144    0.014   -1.194 60  70  80  90  100
## Sleep_Hours        7.027  1.439   2 0.205   -0.020   -0.424  4   6   7   8   10
## Previous_Scores   75.071 14.400  25 0.192   -0.004   -1.191 50  63  75  88  100
## Tutoring_Sessions  1.494  1.231   1 0.824    0.816    0.644  0   1   1   2    8
## Physical_Activity  2.968  1.031   2 0.347   -0.031   -0.059  0   2   3   4    6
## Exam_Score        67.222  3.815   4 0.057    1.604   10.584 56  65  67  69  100

3.2. Korelacje

Poniżej przedstawione zostały korelacje pomiędzy zmiennymi ilościowymi, wyznaczone za pomocą współczynnika korelacji r Pearsona.

dane %>%
  select(where(is.numeric)) %>%
  cor()
##                   Hours_Studied   Attendance   Sleep_Hours Previous_Scores
## Hours_Studied       1.000000000 -0.009907859  0.0088745847      0.02484578
## Attendance         -0.009907859  1.000000000 -0.0160910091     -0.02018610
## Sleep_Hours         0.008874585 -0.016091009  1.0000000000     -0.02145357
## Previous_Scores     0.024845782 -0.020186103 -0.0214535720      1.00000000
## Tutoring_Sessions  -0.014282264  0.014323509 -0.0154707591     -0.01312233
## Physical_Activity   0.004624390 -0.022434703 -0.0003700937     -0.01127373
## Exam_Score          0.446015481  0.583875961 -0.0206054665      0.17076398
##                   Tutoring_Sessions Physical_Activity  Exam_Score
## Hours_Studied           -0.01428226      0.0046243903  0.44601548
## Attendance               0.01432351     -0.0224347027  0.58387596
## Sleep_Hours             -0.01547076     -0.0003700937 -0.02060547
## Previous_Scores         -0.01312233     -0.0112737339  0.17076398
## Tutoring_Sessions        1.00000000      0.0177329453  0.15287689
## Physical_Activity        0.01773295      1.0000000000  0.03016639
## Exam_Score               0.15287689      0.0301663887  1.00000000

3.3. Macierz korelacji

3.3.1. Macierz korelacji zmiennych ilościowych

Poniżej przedstawiono macierz korelacji dla zmiennych ilościowych. Korelacje obliczone zostały za pomocą współczynnika korelacji r Pearsona.

cor_matrix <- dane %>%
  select(where(is.numeric)) %>%
  cor()

cor_matrix <- cor(dane[, c("Hours_Studied", "Attendance", "Sleep_Hours", 
                               "Previous_Scores", "Tutoring_Sessions", 
                               "Physical_Activity", "Exam_Score")], 
                  use = "pairwise.complete.obs")

corrplot(cor_matrix, method = "color", tl.cex = 0.8, addCoef.col = "black")

3.3.2. Macierz korelacji zmiennych jakościowych

Poniżej zaprezentowano macierz korelacji zmiennych jakościowych.

# Filtracja danych jakościowych

dane_cor <- dane %>%
  select(where(is.factor))


# Przygotowanie argumentu do obliczenia korelacji

categorical_vars <- c("Parental_Involvement", "Access_to_Resources",
                      "Extracurricular_Activities", "Motivation_Level",
                      "Internet_Access", "Family_Income", "Teacher_Quality",
                      "School_Type", "Peer_Influence",
                      "Learning_Disabilities", "Parental_Education_Level",
                      "Distance_from_Home", "Gender")

# Definiowanie funkcji do obliczenia wartości współczynnika V Cramera

calculate_cramer_v <- function(var1, var2) {
  contingency_table <- table(var1, var2)
  cramer_v_result <- assocstats(contingency_table)$cramer
  return(cramer_v_result)
}

# Przygotowanie pustej macierzy, w której zostaną zapisane wyniki

cramer_matrix <- matrix(NA, nrow = length(categorical_vars), ncol = length(categorical_vars), 
                        dimnames = list(categorical_vars, categorical_vars))

# Obliczanie Cramera dla każdej pary zmiennych
for (i in 1:(length(categorical_vars) - 1)) {
  for (j in (i + 1):length(categorical_vars)) {
    var1 <- categorical_vars[i]
    var2 <- categorical_vars[j]
    cramer_matrix[i, j] <- calculate_cramer_v(dane_cor[[var1]], dane_cor[[var2]])
    cramer_matrix[j, i] <- cramer_matrix[i, j]
  }
}

# Wizualizacja macierzy Cramera
corrplot(cramer_matrix, method = "color", tl.cex = 0.8, addCoef.col = "black")

4. Wnioskowanie statystyczne

W tym rozdziale wykonane zostanie wnioskowanie statystyczne. Podzielono je na dwie części: dla zmiennych ilościowych i jakościowych.

4.1. Wnioskowanie statystyczne dla zmiennych ilościowych

W tym podrozdziale przeprowadzone zostały testy statystyczne dla zmiennych ilościowych. Konkretnie badane jest, czy zmienne ilościowe z zestawu danych wpływają na wyniki egzaminu. Hipoteza zerowa zakłada, że nie ma takiego wpływu (jest on zerowy), natomiast hipoteza alternatywna mówi, że istnieje istotna statystycznie zależność. Stosowanym poziomem istotności alfa będzie 0,05.

Na początku sprawdzona zostanie normalność rozkładu zmiennej ocen z egzaminu. Hipoteza zerowa zakłada, że rozkład jest normalny, a hipoteza alternatywna - że nie jest. Zastosowano test Kołmogorowa-Smirnowa oraz test Andersona-Darlinga.

lillie.test(dane$Exam_Score)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  dane$Exam_Score
## D = 0.080473, p-value < 2.2e-16
ad.test(dane$Exam_Score)
## 
##  Anderson-Darling normality test
## 
## data:  dane$Exam_Score
## A = 47.115, p-value < 2.2e-16

P-value z obu testów jest niższe od poziomu istotności alfa wynoszącego 0,05, więc odrzucamy hipotezę zerową na rzecz hipotezy alternatywnej. Oznacza to, że wyniki z egzaminu nie mają rozkładu normalnego.

Na podstawie wykresów pudełkowych z podrozdziału 2.1 można powiedzieć, że w zmiennej Exam_Score występuje wiele wartości odstających. W tych warunkach nie będzie można skorzystać z testów parametrycznych zakładających normalność i symetrię rozkładu. Zastosowane zostaną więc testy odporne (robust).

# hours studied - wplyw
ggscatterstats(data = dane, x = Hours_Studied, y = Exam_Score, type = "r")
## Registered S3 method overwritten by 'ggside':
##   method from   
##   +.gg   ggplot2
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value z testu jest niezwykle niskie, wynosi 1,37E-304. Jest to wartość mniejsza od poziomu istotności, więc należy odrzucić hipotezę zerową. Istnieje zależność pomiędzy liczbą godzin nauki a wynikiem z egzaminu.

# attendance - wplyw
ggscatterstats(data = dane, x = Attendance, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value z testu jest niższe od poziomu istotności, więc odrzucamy hipotezę zerową na rzecz hipotezy alternatywnej. Zatem istnieje zależność pomiędzy obecnością na zajęciach a oceną z egzaminu.

# sleep hours - wplyw
ggscatterstats(data = dane, x = Sleep_Hours, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value z testu wynosi 0,83, więc jest większe od poziomu istotności. Zatem nie ma podstaw do odrzucenia hipotezy zerowej o braku statystycznie istotnej zależności między średnią liczbą godzin snu a wynikiem z egzaminu.

# previous scores - wplyw
ggscatterstats(data = dane, x = Previous_Scores, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value z testu jest niższe od poziomu istotności alfa, więc istnieją podstawy do odrzucenia hipotezy zerowej. Istnieje więc zależność pomiędzy wcześniejszymi wynikami z egzaminów a wynikiem z egzaminu końcowego.

# tutoring sessions - wplyw
ggscatterstats(data = dane, x = Tutoring_Sessions, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value jest mniejsze od poziomu istotności, więc są podstawy do odrzucenia hipotezy zerowej. Istnieje zależność pomiędzy liczbą godzin korepetycji a wynikami z egzaminu.

# physical activity - wplyw
ggscatterstats(data = dane, x = Physical_Activity, y = Exam_Score, type = "r")
## `stat_xsidebin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_ysidebin()` using `bins = 30`. Pick better value with `binwidth`.

P-value z testu wynosi 0,06, więc na poziomie istotności alfa równym 0,05 nie ma podstaw do odrzucenia hipotezy zerowej o braku zależności pomiędzy średnią liczbą godzin aktywności fizycznej a wynikami z egzaminu.

4.2. Wnioskowanie statystyczne dla zmiennych jakościowych

W tym podrozdziale zostały przeprowadzone testy statystyczne dla zmiennych jakościowych. Badają powiązane konkretnych zmiennych z wynikami egzaminów. Hipoteza zerowa mówi, że nie ma powiązania pomiędzy zmiennymi, natomiast hipoteza alternatywna mówi, że istnieje istotna statystycznie zależność. Poziom istotności ponownie będzie wynosił 0,05. Ponownie ze względu na brak rozkładu normalnego i asymetrii rozkładu zmiennej Exam_Score zastosowane zostały testy odporne (robust).

ggbetweenstats(
  data = dane,
  x = Parental_Involvement,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje istotne statystycznie powiązanie między poziomem zaangażowania rodziców a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Access_to_Resources,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy dostępem do zasobów a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = Extracurricular_Activities,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wykonywaniem aktywności dodatkowych a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = Motivation_Level,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy poziomem motywacji a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = Internet_Access,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy dostępem do Internetu a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = Family_Income,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy poziomem dochodów rodziny a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = Teacher_Quality,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy jakością nauczycieli a wynikami uczniów z egzaminów.

ggbetweenstats(
  data = dane,
  x = School_Type,
  y = Exam_Score,
  type = "r"
)

P-value wynosi 0,74, a więc jest wyższe od poziomu istotności. Oznacza to, że nie ma podstaw do odrzucenia hipotezy zerowej. Zatem nie ma istotnie statystycznego powiązania pomiędzy rodzajem szkoły a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Peer_Influence,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wpływem rówieśników a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Learning_Disabilities,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy obecnością trudności w uczeniu się a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Parental_Education_Level,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy wykształceniem rodziców a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Distance_from_Home,
  y = Exam_Score,
  type = "r"
)

P-value jest niższe od poziomu istotności, więc istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Istnieje zależność pomiędzy odległością od domu a wynikami uczniów z egzaminu.

ggbetweenstats(
  data = dane,
  x = Gender,
  y = Exam_Score,
  type = "r"
)

P-value wynosi 0,51, a więc jest wyższe od poziomu istotności. Oznacza to, że nie ma podstaw do odrzucenia hipotezy zerowej. Zatem nie ma istotnie statystycznego powiązania pomiędzy płcią a wynikami uczniów z egzaminu.

5. Modelowanie

Jako ostatni etap projektu wykonano analizę za pomocą modelowania ekonometrycznego. Badany będzie wpływ różnych zmiennych z zestawu danych na wyniki uczniów z egzaminu. Zatem zmienną objaśnianą będzie zmienna Exam_Score, a zmiennymi objaśniającymi będą wszystkie zmienne, które w poprzednim rozdziale uznano za powiązane z wynikami egzaminów.

5.1. Oszacowanie modelu

dane_imp <- read_csv("czynniki-imputowane.csv")
## Rows: 6607 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (13): Parental_Involvement, Access_to_Resources, Extracurricular_Activit...
## dbl  (7): Hours_Studied, Attendance, Sleep_Hours, Previous_Scores, Tutoring_...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
dane_imp$Exam_Score <- ifelse(dane_imp$Exam_Score > 100, 100, dane_imp$Exam_Score)

model1 <- lm(formula = Exam_Score ~
               Hours_Studied + Attendance + Parental_Involvement +
               Access_to_Resources + Extracurricular_Activities +
               Previous_Scores + Motivation_Level + Internet_Access +
               Tutoring_Sessions + Family_Income + Teacher_Quality +
               Peer_Influence + Learning_Disabilities +
               Parental_Education_Level + Distance_from_Home,
             data = dane_imp)
summary(model1)
## 
## Call:
## lm(formula = Exam_Score ~ Hours_Studied + Attendance + Parental_Involvement + 
##     Access_to_Resources + Extracurricular_Activities + Previous_Scores + 
##     Motivation_Level + Internet_Access + Tutoring_Sessions + 
##     Family_Income + Teacher_Quality + Peer_Influence + Learning_Disabilities + 
##     Parental_Education_Level + Distance_from_Home, data = dane_imp)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.2539 -0.4832 -0.1580  0.1619 29.8638 
## 
## Coefficients:
##                                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                          42.792940   0.288419 148.371  < 2e-16 ***
## Hours_Studied                         0.290412   0.004176  69.549  < 2e-16 ***
## Attendance                            0.195285   0.002168  90.093  < 2e-16 ***
## Parental_InvolvementLow              -1.896650   0.072586 -26.130  < 2e-16 ***
## Parental_InvolvementMedium           -0.985927   0.058259 -16.923  < 2e-16 ***
## Access_to_ResourcesLow               -1.989673   0.072410 -27.478  < 2e-16 ***
## Access_to_ResourcesMedium            -0.962888   0.057753 -16.673  < 2e-16 ***
## Extracurricular_ActivitiesYes         0.552460   0.051007  10.831  < 2e-16 ***
## Previous_Scores                       0.046051   0.001739  26.481  < 2e-16 ***
## Motivation_LevelLow                  -1.018916   0.072594 -14.036  < 2e-16 ***
## Motivation_LevelMedium               -0.537594   0.066117  -8.131 5.05e-16 ***
## Internet_AccessYes                    0.886869   0.094637   9.371  < 2e-16 ***
## Tutoring_Sessions                     0.479366   0.020314  23.598  < 2e-16 ***
## Family_IncomeLow                     -0.989240   0.068851 -14.368  < 2e-16 ***
## Family_IncomeMedium                  -0.504825   0.069075  -7.308 3.02e-13 ***
## Teacher_QualityLow                   -0.970292   0.090982 -10.665  < 2e-16 ***
## Teacher_QualityMedium                -0.481692   0.055840  -8.626  < 2e-16 ***
## Peer_InfluenceNeutral                 0.500333   0.067827   7.377 1.82e-13 ***
## Peer_InfluencePositive                0.978517   0.067576  14.480  < 2e-16 ***
## Learning_DisabilitiesYes             -0.820549   0.081494 -10.069  < 2e-16 ***
## Parental_Education_LevelHigh School  -0.435232   0.057547  -7.563 4.47e-14 ***
## Parental_Education_LevelPostgraduate  0.472484   0.071853   6.576 5.21e-11 ***
## Distance_from_HomeModerate            0.397690   0.090610   4.389 1.16e-05 ***
## Distance_from_HomeNear                0.876445   0.085033  10.307  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.03 on 6583 degrees of freedom
## Multiple R-squared:  0.7186, Adjusted R-squared:  0.7177 
## F-statistic: 731.1 on 23 and 6583 DF,  p-value: < 2.2e-16

5.2. Diagnostyka modelu

W tym podrozdziale została przedstawiona diagnostyka stworzonego modelu.

Na podstawie współczynnika determinacji (statystyki R-kwadrat) można powiedzieć, że model tłumaczy 71,86% zmienności ocen uczniów z egzaminu.

Testując przydatność modelu, hipoteza zerowa mówi, że model nie jest istotny statystycznie, natomiast hipoteza alternatywna mówi, że jest. Na podstawie testu F można określić, że p-value z tego testu jest niższe od poziomu istotności alfa równego 0,05, co oznacza, że istnieją podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej, co oznacza, że model jest przydatny.

Testując czy rozkład składnika resztowego jest rozkładem normalnym, hipoteza zerowa mówi, że rozkład jest rozkładem normalnym, a hipoteza alternatywna mówi, że nie jest. Można tu wykorzystać test Kołmogorowa-Smirnowa.

lillie.test(model1$residuals)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  model1$residuals
## D = 0.32292, p-value < 2.2e-16

P-value z testu jest niższe od poziomu istotności, więc istnieją podstawy, by odrzucić hipotezę zerową na rzecz alternatywnej. Rozkład reszt nie jest rozkładem normalnym. Zatem następnym krokiem jest sprawdzenie jak wygląda rozkład składnika resztowego.

reszty <- tibble(res = model1$residuals)

ggplot(reszty, aes(x = res)) +
  geom_histogram(bins = 50, colour = "black", fill = "firebrick") +
  labs(x = "Reszty modelu",
       y = "Liczebność") +
  my_theme

Jak widać na wykresie, reszty są bardzo silnie skupione wokół zera, z czego najprawdopodobniej wynika, że nie jest to rozkład normalny.

Następnie można sprawdzić, czy reszty zachowują stałość wariancji (homoskedastyczność). Hipoteza zerowa mówi, że reszty zachowują stałość wariancji (są homoskedastyczne), natomiast hipoteza alternatywna mówi, że nie zachowują stałości wariancji (są heteroskedastyczne). Wykorzystany do tego zostanie test White’a.

ncvTest(model1)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 18.52631, Df = 1, p = 1.6757e-05

P-value z testu White’a jest niższe od poziomu istotności, co oznacza, że są podstawy do odrzucenia hipotezy zerowej na rzecz hipotezy alternatywnej. Reszty modelu nie zachowują stałości wariancji, czyli są heteroskedastyczne.

Następnie można sprawdzić, czy zmienne w modelu są współliniowe, co sugerowałoby potrzebę usunięcia tych zmiennych.

vif(model1)
##                                GVIF Df GVIF^(1/(2*Df))
## Hours_Studied              1.003003  1        1.001501
## Attendance                 1.004245  1        1.002120
## Parental_Involvement       1.007099  2        1.001770
## Access_to_Resources        1.006713  2        1.001674
## Extracurricular_Activities 1.004270  1        1.002133
## Previous_Scores            1.005174  1        1.002583
## Motivation_Level           1.008078  2        1.002013
## Internet_Access            1.002516  1        1.001257
## Tutoring_Sessions          1.001612  1        1.000806
## Family_Income              1.006267  2        1.001563
## Teacher_Quality            1.006669  2        1.001663
## Peer_Influence             1.007046  2        1.001757
## Learning_Disabilities      1.002156  1        1.001077
## Parental_Education_Level   1.005444  2        1.001358
## Distance_from_Home         1.004671  2        1.001166

Wszystkie wartości VIF są bardzo bliskie 1, co oznacza, że zmienne zawarte w modelu nie są ze sobą skorelowane w żaden sposób, co jest pozytywne z punktu widzenia modelu.

Ostatecznie można ocenić, że model nie jest złym modelem, ze względu na dość wysoki R-kwadrat oraz brak współliniowości zmiennych. Nie spełnia on jednak założenia normalności rozkładu reszt oraz homoskedastyczności reszt. Sugeruje to, że istnieją inne czynniki, niezawarte w tym zbiorze danych, które wpływają na wyniki uczniów z egzaminów.

5.3. Interpretacja modelu

Interpretacja współczynników modelu:

Wzrost liczby godzin nauki o 1 godzinę powoduje wzrost wyniku z egzaminu średnio o 0,29 p.p., ceteris paribus.

Wzrost odsetka obecności o 1 p.p. powoduje wzrost wyniku z egzaminu średnio o 0,2 p.p., ceteris paribus.

Uczniowie o niskim poziomie zaangażowania rodziców mają średnio o 1,9 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie zaangażowania rodziców, ceteris paribus.

Uczniowie o średnim poziomie zaangażowania rodziców mają średnio o 0,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie zaangażowania rodziców, ceteris paribus.

Uczniowie o niskim poziomie dostępu do zasobów mają średnio o 1,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dostępu do zasobów, ceteris paribus.

Uczniowie o średnim poziomie dostępu do zasobów mają średnio o 0,96 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dostępu do zasobów, ceteris paribus.

Uczniowie biorący udział w zajęciach pozalekcyjnych mają średnio o 0,55 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy nie biorą udziału w żadnych zajęciach pozalekcyjnych, ceteris paribus.

Wzrost wyniku z poprzedniego egzaminu o 1 p.p. powoduje wzrost wyniku z egzaminu średnio o 0,05 p.p., ceteris paribus.

Uczniowie o niskim poziomie motywacji mają średnio o 1,02 p.p. niższy wynik z egzaminu niż uczniowie o wysokim poziomie motywacji, ceteris paribus.

Uczniowie o średnim poziomie motywacji mają średnio o 0,54 p.p. niższy wynik z egzaminu niż uczniowie o wysokim poziomie motywacji, ceteris paribus.

Uczniowie z dostępem do Internetu mają średnio o 0,89 p.p. wyższy wynik z egzaminu niż uczniowie bez dostępu do Internetu, ceteris paribus.

Wzrost liczby godzin korepetycji o 1 godzinę powoduje wzrost wyniku z egzaminu średnio o 0,48 p.p., ceteris paribus.

Uczniowie o niskim poziomie dochodu w rodzinie mają średnio o 0,99 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dochodów w rodzinie, ceteris paribus.

Uczniowie o średnim poziomie dochodu w rodzinie mają średnio o 0,5 p.p. niższe wyniki z egzaminu niż uczniowie o wysokim poziomie dochodów w rodzinie, ceteris paribus.

Uczniowie o niskiej jakości nauczycieli mają średnio o 0,97 p.p. niższe wyniki z egzaminu niż uczniowie o wysokiej jakości nauczycieli, ceteris paribus.

Uczniowie o średniej jakości nauczycieli mają średnio o 0,48 p.p. niższe wyniki z egzaminu niż uczniowie o wysokiej jakości nauczycieli, ceteris paribus.

Uczniowie o neutralnym wpływie rówieśników mają średnio o 0,5 p.p. wyższe wyniki z egzaminu niż uczniowie o negatywnym wpływie rówieśników, ceteris paribus.

Uczniowie o pozytywnym wpływie rówieśników mają średnio o 0,98 p.p. wyższe wyniki z egzaminu niż uczniowie o negatywnym wpływie rówieśników, ceteris paribus.

Uczniowie posiadający trudności w uczeniu się mają średnio o 0,82 p.p. niższe wyniki z egzaminu niż uczniowie, którzy ich nie posiadają, ceteris paribus.

Uczniowie, których rodzice mają maksymalnie wykształcenie szkoły średniej mają średnio o 0,44 p.p. niższe wyniki z egzaminu niż uczniowie, których rodzice mają maksymalnie wykształcenie z uczelni wyższej, ceteris paribus.

Uczniowie, których rodzice mają maksymalnie wykształcenie ze studiów podyplomowych mają średnio o 0,47 p.p. wyższe wyniki z egzaminu niż uczniowie, których rodzice mają maksymalnie wykształcenie z uczelni wyższej, ceteris paribus.

Uczniowie, którzy mają umiarkowaną odległość szkoły od miejsca zamieszkania mają średnio o 0,4 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy mają daleko do szkoły, ceteris paribus.

Uczniowie, którzy mają blisko do szkoły od miejsca zamieszkania mają średnio o 0,88 p.p. wyższe wyniki z egzaminu niż uczniowie, którzy mają daleko do szkoły, ceteris paribus.

6. Podsumowanie

Podsumowując projekt, wykonano w nim wiele ważnych czynności z perspektywy analizy danych. W części Data Wrangling Wykonano oczyszczanie danych, walidacje danych i imputacje braków danych. W części wizualizacji wykonano wiele wykresów, które pozwoliły na zobrazowanie jak wygląda zestaw danych, korzystając z pakietów takich jak ggplot2 oraz plotly w celu tworzenia dobrze prezentujących się wizualizacji. W analizie opisowej obliczono statystyki opisowe oraz współczynniki korelacji dla wszystkich zmiennych. W części dotyczącej wnioskowania statystycznego wykonano wiele testów statystycznych, które pozwoliły na określenie struktury niektórych zmiennych oraz zbadanie występowania zależności pomiędzy zmiennymi a wynikami z egzaminów. Udało się w ten sposób ustalić, że zdecydowana większość zmiennych zawartych w zestawie danych jest powiązana z wynikami uczniów. W ostatnim rozdziale wykorzystano modelowanie ekonometryczne w celu określenia, w jaki sposób i z jaką siłą czynniki z zestawu danych wpływają na wyniki uczniów. W ten sposób stworzono model, który można również wykorzystać do przewidywania wyników uczniów. Można zatem powiedzieć, że udało się zbadać czynniki wpływające na wyniki uczniów, pod kątem jakie to są czynniki oraz w jaki sposób wpływają na wyniki.